МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Лабораторна робота № 10
з дисципліни " Засоби системного програмування "
на тему:
"Багатомодульне програмування "
ЗАВДАННЯ:
Створити *.exe програму, яка реалізовує обчислення, заданого варіантом виразу.
Програма повинна складатися з чотирьох модулів:головний модуль – містить спільний сегмент стеку, необхідні дані та виклик основних процедур;модуль вводу - забезпечує ввід даних з клавіатури в десятковій формі;модуль безпосередніх обчислень – здійснює всі необхідні арифметичні дії. модуль виводу – забезпечує вивід на екран результату в десятковій формі.
Всі модулі повинні бути в різних файлах і об’єднані на етапі лінкування. Передача параметрів може здійснюватися довільним чином.
Переконатися у правильності роботи кожного модуля зокрема та програми загалом.
Скласти звіт про виконану роботу з приведенням тексту програми та коментарів до неї.
Дати відповідь на контрольні запитання.
8
X=A4-B2+K-D2/E1+F1*B2
88
Лістинг програми:
main.asm
DOSSEG
EXTRN Input :FAR, Calculation :FAR, Output :FAR
PUBLIC erFlag
STACKSG SEGMENT PARA STACK 'Stack'
DW 127 DUP(0)
STACKSG ENDS
DATASG SEGMENT PARA PUBLIC 'Data'
erFlag DB 0
DATASG ENDS
CODESG SEGMENT PARA PUBLIC 'Code'
main:
ASSUME CS:CODESG,DS:DATASG,SS:STACKSG
MOV AX,DATASG
MOV DS,AX
CALL input
cmp erFlag,0
jne A30
CALL calculation
cmp erFlag,0
jne A30
CALL output
cmp erFlag,0
jne A30
A30:
mov ah,4Ch
int 21h
CODESG ENDS
END main
input.asm
DOSSEG
EXTRN erFlag:BYTE
PUBLIC A,B,D,E,F
MY_MUL MACRO X,Y,Z
mov z,0
mov z+2,0
MOV AX,X
MUL Y
MOV Z,AX
MOV Z+2,DX
MOV AX,X+2
MUL Y
ADD Z+2,AX
mov ax,Z
mov dx,Z+2
ENDM
DATASG SEGMENT PARA PUBLIC 'Data'
A label word
dd 0
B dw 0
D dw 0
E db 0
F db 0
Temp1 dw 00h
Temp2 dw 00h,00h
X dw 00h,00h
X_Str db 10 dup (0)
TempStr db 10 dup (0)
TempBin dw 0,0
MaxLen dw 0
X_div2 dw 0,0
Y_div2 dw 0
MESSG_X DB 13,10,'X=A4-B2+K-D2/E1+F1*B2 K=136 (88h)','$'
MESSG_A DB 13,10,'A = ','$'
MESSG_B DB 13,10,'B = ','$'
MESSG_D DB 13,10,'D = ','$'
MESSG_E DB 13,10,'E = ','$'
MESSG_F DB 13,10,'F = ','$'
MESSG_X1 DB 13,10,'X = ','$'
erStr1 db 13,10,'Data not input_variable',13,10,'$'
erStr2 db 13,10,'Incorrectly data ',13,10,'$'
erStr2_1 db 13,10,' E = 0 --> divide by zero ',13,10,'$'
erStr3 db 13,10,'Data is too long ',13,10,'$'
minus db '-$'
Mult10 dw 1,0
my_z dw 0,0
Bool dw,0
Carry dw,0
DATASG ENDS
CODESG SEGMENT PARA PUBLIC 'CODE'
ASSUME DS:DATASG, CS:CODESG
input proc FAR
public Input
LEA DX,MESSG_X
MOV AH,09
INT 21H
LEA DX,MESSG_A
MOV AH,09
INT 21H
mov di,offset A
mov MaxLen,10
mov cx,MaxLen
call input_variable
LEA DX,MESSG_B
MOV AH,09
INT 21H
mov di,offset B
mov MaxLen,5
mov cx,MaxLen
call input_variable
LEA DX,MESSG_D
MOV AH,09
INT 21H
mov di,offset D
mov MaxLen,5
mov cx,MaxLen
call input_variable
LEA DX,MESSG_E
MOV AH,09
INT 21H
mov di,offset E
mov MaxLen,3
mov cx,MaxLen
call input_variable
LEA DX,MESSG_F
MOV AH,09
INT 21H
mov di,offset F
mov MaxLen,3
mov cx,MaxLen
call input_variable
ret
input endp
input_variable PROC
mov si,0
In_00:
mov ah,01
int 21h
cmp al,' '
je In_00
cmp al,' '
je In_00
cmp al,'-'
jne In_01
mov Bool,1
In_001:
mov ah,01
int 21h
In_01:
cmp al,0Dh
je In_1
In_0: mov dl,al
call CHECK_BYTE
mov TempStr[si],dl
inc si
loop In_001
In_1: push si
dec si
cmp c...